package com.sky.aspect;

import com.sky.annotation.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.time.LocalDateTime;

@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    // 切入点
    @Pointcut("execution(* com.sky.*.*.*(..)) && @annotation(com.sky.annotation.AutoFill))")
    public void autoFillPointCut() {
    }

    // 在调用方法mapper中的方法之前触发
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint) {
        // log.info("开始进行公共字段自动填充...");

        // System.out.println("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈");
        //
        // // 获取方法的签名：void com.sky.service.impl.CategoryServiceImpl.update(CategoryDTO)
        // MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //
        // // 获取方法具体信息：public void com.sky.service.impl.CategoryServiceImpl.update(com.sky.dto.CategoryDTO)
        // Method method = signature.getMethod();
        //
        // // 获取方法的注解：@com.sky.annotation.AutoFill(UPDATE)
        // AutoFill autoFill = method.getAnnotation(AutoFill.class);// 获得方法上的注解对象
        //
        // // 获取方法注解的值：UPDATE
        // OperationType operationType = autoFill.value();// 获得数据库操作类型
        //
        // // 获取方法的参数：[Ljava.lang.Object;@78c3a960
        // Object[] args = joinPoint.getArgs();
        //
        // // 如果没有参数就终止后续代码执行
        // if (args == null || args.length == 0) return;
        //
        // Object obj = args[0];
        //
        // // 当前用户ID
        // long currentId = BaseContext.getCurrentId();
        //
        // // 当前时间
        // LocalDateTime now = LocalDateTime.now();
        //
        // // 根据注解的值判断是新增还是修改操作
        // try {
        //     if (operationType.equals(OperationType.INSERT)) {
        //         // getDeclaredMethod():获取本类方法;getMethod():获取父类方法
        //         Method setCreateTime = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
        //         Method setCreateUser = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
        //         // 通过反射为对象属性进行赋值
        //         setCreateTime.invoke(obj, now);
        //         setCreateUser.invoke(obj, currentId);
        //     }
        //     Method setUpdateTime = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
        //     Method setUpdateUser = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
        //     setUpdateTime.invoke(obj, now);
        //     setUpdateUser.invoke(obj, currentId);
        // } catch (Exception e) {
        //     e.printStackTrace();
        // }
    }
}